package com.note.feng.leetcode.algorithms.easy.tree;

public class HundredEight {

    /**
     * 108 将有序数组转换为二叉搜索树
     * 给你一个整数数组 nums ，其中元素已经按 升序 排列，请你将其转换为一棵 高度平衡 二叉搜索树。
     *
     * 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
     *
     * 示例 1：
     *
     * 输入：nums = [-10,-3,0,5,9]
     * 输出：[0,-3,9,-10,null,5]
     * 解释：[0,-10,5,null,-3,null,9] 也将被视为正确答案：
     *
     * 示例 2：
     *
     * 输入：nums = [1,3]
     * 输出：[3,1]
     * 解释：[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
     *
     * 提示：
     *
     * 1 <= nums.length <= 104
     * -104 <= nums[i] <= 104
     * nums 按 严格递增 顺序排列
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree
     */
    /**
     *解法：
     * 递归：
     * 升序数组，跟节点应该是数组的中间节点，这样才能保证数的高度平衡
     * 每次都是区数组的中间节点构建node
     * @param nums
     * @return
     */
    public TreeNode sortedArrayToBST(int[] nums) {
        int lenth = nums.length;
        if(lenth == 1){
            return new TreeNode(nums[0]);
        }
        TreeNode node =  buildTree(nums, 0, lenth - 1);
        return node;
    }

    private TreeNode buildTree(int [] nums, int left, int right){
        if(left > right){
            return null;
        }
        int mid = (right - left) / 2 + left;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = buildTree(nums, left, mid - 1);
        root.right = buildTree(nums, mid + 1, right);
        return root;
    }

    public static void main(String[] args) {
        HundredEight hundredEight = new HundredEight();
        int nums[] = new int[]{0,1,2,3,4,5};
        hundredEight.sortedArrayToBST(nums);
    }

    public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
    }
}
